home *** CD-ROM | disk | FTP | other *** search
- /*
- .pn1
- .he DREXEL ATGS */
-
- constrainlist( [constraint1] ).
-
- constraint1( pc_inv, pdcfinv, pcinv ).
- buf( pc_buf, pdcfbuf, pcbuf ).
- and2( pc_and2, pdcfand2, pcand2 ).
- and3( pc_and3, pdcfand3, pcand3 ).
- or2( pc_or2, pdcfor2, pcor2 ).
- or3( pc_or3, pdcfor3, pcor3 ).
-
- /* The primitive cubes of the logic elements.
- Form: pc_type( output, [list of prime implicants] ). */
-
- pc_inv( 0, [[1]] ).
- pc_inv( 1, [[0]] ).
- pc_buf( 0, [[0]] ).
- pc_buf( 1, [[1]] ).
- pc_and2( 0, [[0,_],[_,0]] ).
- pc_and2( 1, [[1,1]] ).
- pc_and3( 0, [[0,_,_],[_,0,_],[_,_,0]] ).
- pc_and3( 1, [[1,1,1]] ).
-
- pc_or2( 1, [[1,_],[_,1]] ).
- pc_or2( 0, [[0,0]] ).
- pc_or3( 1, [[1,_,_],[_,1,_],[_,_,1]] ).
- pc_or3( 0, [[0,0,0]] ).
-
-
- /* The primitive D-cubes of the logic elements: */
-
- pdcfinv( sa0(_), db, [[1]] ).
- pdcfinv( sa1(_), d, [[0]] ).
- pdcfbuf( sa0(_), d, [[1]] ).
- pdcfbuf( sa1(_), db, [[0]] ).
- pdcfand2( sa0(_), d, [[1,1]] ).
- pdcfand2( sa1(1), db, [[0,1]] ).
- pdcfand2( sa1(2), db, [[1,0]] ).
- pdcfand3( sa0(_), d, [[1,1,1]] ).
- pdcfand3( sa1(1), db, [[0,1,1]] ).
- pdcfand3( sa1(2), db, [[1,0,1]] ).
- pdcfand3( sa1(3), db, [[1,1,0]] ).
-
- pdcfor2( sa0(1), d, [[1,0]] ).
- pdcfor2( sa0(2), d, [[0,1]] ).
- pdcfor2( sa1(_), db, [[0,0]] ).
-
- pdcfor3( sa0(1), d, [[1,0,0]] ).
- pdcfor3( sa0(2), d, [[0,1,0]] ).
- pdcfor3( sa0(3), d, [[0,0,1]] ).
- pdcfor3( sa1(_), db, [[0,0,0]] ).
-
- /* The propagation D-cubes of the logic elements: */
-
- pcinv( d, [[db]] ).
- èpcinv( db, [[d]] ).
- pcbuf( d, [[d]] ).
- pcbuf( db, [[db]] ).
- pcand2( d, [[1,d],[d,1],[d,d]] ).
- pcand2( db,[[1,db],[db,1],[db,db]] ).
- pcor2( d, [[0,d],[d,0,],[d,d]] ).
- pcor2( db, [[0,db],[db,0],[db,db]] ).
- pcand3( d,
- [[d,1,1],[1,d,1],[1,1,d],[d,d,1],[d,1,d],[1,d,d],[d,d,d]] ).
- pcand3( db,
- [[db,1,1],[1,db,1],[1,1,db],[db,db,1],[db,1,db],[1,db,db],[db,db,db]] ).
- pcor3( d,
- [[d,0,0],[0,d,0],[0,0,d],[d,d,0],[d,0,d],[0,d,d],[d,d,d]] ).
- pcor3( db,
- [[db,0,0],[0,db,0],[0,0,db],[db,db,0],[db,0,db],[0,db,db],[db,db,db]] ).
-
-
- /* Samples:
- Type: and3( pdcfand3, pcand3 ).
- Pdcfclass: pdcfand3( sa1(3), db, [[1,1,0]] ).
- Gate: r6( or3, 3, [n25,n26,n28], n34 ).
- */
-
- /* Gatelines = [ [x,x,x], [x,x,x],..., [x,x,x] ] */
- /* Netnames = [ nx(val), .... nx(val) ] */
-
-
-
- /*
- Netvals = current assignments of nets: [n1(1), n5(0),.....,nn(x)]
- Inputnets = input nets to specific gate: [n1,n3,..nx]
- Inputvals = [1,0,.d, db, 0]
- */
-
-
-
-
- listsubt( [], _, Res, Res ).
- listsubt( [Head|Mainlist], El, Buildlist, Result ) :-
- (Head == El, listsubt( Mainlist, El, Buildlist, Result ));
- listsubt( Mainlist, El, [Head|Buildlist], Result ), !.
-
- findouttests( Gate, Fault ) :-
- print('\nSynthesizing Output Tests for: ', Gate, ' Fault: ', Fault ),
- memleft( Memleft1 ),
- print( '\nMemleft start gen: ', Memleft1 ),
- (ftout( Gate, Fault ); true),
- !.
-
- ftout( Gate, Fault ) :-
- gentestoutp( Gate, Fault, TestInputs, TestOutputs ),
- asserta( test( Gate, output, Fault, TestInputs, TestOutputs ) ),
- print( '\n Testinputs: ', TestInputs ),
- print( '\n Testoutputs: ', TestOutputs ),
- !,
- è fail.
-
-
- findinptests( Gate, Input, Fault ) :-
- print('\nSynthesizing Input Tests for: ', Gate, ', Input: ', Input,
- ' Fault: ', Fault ),
- (ftinp( Gate, Input, Fault ); true), !.
-
-
- ftinp( Gate, Input, Fault ) :-
- gentestinp( Gate, Input, Fault, TestInputs, TestOutputs ),
- print( '\n Testinputs: ', TestInputs ),
- print( '\n Testoutputs: ', TestOutputs ),
- asserta( test( Gate, Input, Fault, TestInputs, TestOutputs ) ),
- !,
- fail.
-
- /*
- ftinp( Gate, Input, Fault ) :-
- !,
- test( Gate, Input, Fault, TestInputs, TestOutputs ),
- print( '\n Testinputs: ', TestInputs ),
- print( '\n Testoutputs: ', TestOutputs ),
- fail.
- */
-
-
- gentestoutp( Gate, Fault, TestInputs, TestOutputs ) :-
- Gate( Type, _, Inplist, Outnet ),
- Type( Primcube, _, _ ),
- elements( Ellist ),
- listsubt( Ellist, Gate, [], Sublist ), !,
- (
- (
- Fault == sa0,
- Primcube( 1, Implicants ),
- member( Implicant, Implicants ),
- pairoff( Inplist, Implicant, [], Netvals ),
- ad_vals_to_Net( [Outnet(d)], Netvals, NNetvals )
- );
- (
- Fault == sa1,
- Primcube( 0, Implicants ),
- member( Implicant, Implicants ),
- pairoff( Inplist, Implicant, [], Netvals ),
- ad_vals_to_Net( [Outnet(db)], Netvals, NNetvals )
- )
- ),
- outputs( Outlist ),
- (
- (
- member( Outnet, Outlist ),
- imply1( NNetvals, Sublist, NNNetvals, Undef ),
- justify( NNNetvals, Undef, NNNNetvals ),
- getinps( NNNNetvals, TestInputs ),
- è getoutp( NNNNetvals, TestOutputs )
- );
- (
- not( member( Outnet, Outlist ) ),
- propagate( NNetvals, Sublist,
- NNNetvals, Undef, Solved ),
- Solved == true,
- justify( NNNetvals, Undef, NNNNetvals ),
- getinps( NNNNetvals, TestInputs ),
- getoutp( NNNNetvals, TestOutputs )
- )
- ).
-
-
-
- gentestinp( Gate, Input, Fault, TestInputs, TestOutputs ) :-
- Gate( Type, _, Inplist, Outnet ),
- Type( _, Pdcfclass, _ ),
- elements( Ellist ),
- listsubt( Ellist, Gate, [], Sublist ),
- !,
- Pdcfclass( Fault(Input), Dtype, Implicants ),
- member( Implicant, Implicants ),
- pairoff( Inplist, Implicant, [], Netvals ),
- outputs( Outlist ),
- (
- (
- member( Outnet, Outlist ),
- imply1( [Outnet(Dtype)|Netvals], Sublist, NNetvals, Undef ),
- justify( NNetvals, Undef, NNNetvals ),
- getinps( NNNetvals, TestInputs ),
- getoutp( NNNetvals, TestOutputs )
- );
- (
- not( member( Outnet, Outlist ) ),
- propagate( [Outnet(Dtype)|Netvals], Sublist,
- NNetvals, Undef, Solved ),
- Solved == true,
- justify( NNetvals, Undef, NNNetvals ),
- getinps( NNNetvals, TestInputs ),
- getoutp( NNNetvals, TestOutputs )
- )
- ).
-
- testfanouts :- testf; true.
-
- testf :-
- findfanoutpts( Fans ), !,
- print('\nElements with fanout:\n ', Fans ),
- member( Gate, Fans ),
- memleft( Memleft1 ),
- print( '\nMemleft start gen: ', Memleft1 ),
- findouttests( Gate, sa0 ),
- memleft( Memleft2 ),
- print( '\nMemleft after sa0: ', Memleft2 ),
- è findouttests( Gate, sa1 ),
- memleft( Memleft3 ),
- print( '\nMemleft after sa1: ', Memleft3 ),
- fail.
-
-
- findfanoutpts( Netswfan ) :-
- elements( Ellist ),
- constrainlist( Constlist ),
- ffo( Ellist, Constlist, [], Netswfan ), !.
-
- ffo( [], _, Netform, Netform ).
- ffo( [El|Rem], Constlist, Netform, NetRet ) :-
- (
- El( Type, _, _, Outnet ),
- not( member( Type, Constlist ) ),
- Outnet( _, _, Inputlist ),
- [H|T] = Inputlist, T \= [],
- ffo( Rem, Constlist, [El|Netform], NetRet )
- );
- ffo( Rem, Constlist, Netform, NetRet ).
-
- testoutputs :- testo ; true.
-
- testo :-
- findoutputs( Outputs ), !,
- member( Gate, Outputs ),
- memleft( Memleft1 ),
- print( '\nMemleft start gen: ', Memleft1 ),
- findouttests( Gate, sa0 ),
- memleft( Memleft2 ),
- print( '\nMemleft after sa0: ', Memleft2 ),
- findouttests( Gate, sa1 ),
- memleft( Memleft3 ),
- print( '\nMemleft after sa1: ', Memleft3 ),
- fail.
-
-
-
-
- findoutputs( Netswfan ) :-
- elements( Ellist ),
- outputs( Outputs ),
- fout( Ellist, Outputs, [], Netswfan ), !.
-
- fout( [], _, Netform, Netform ).
- fout( [El|Rem], Outputs, Netform, NetRet ) :-
- (
- El( Type, _, _, Outnet ),
- member( Outnet, Outputs ),
- fout( Rem, Outputs, [El|Netform], NetRet )
- );
- fout( Rem, Outputs, Netform, NetRet ).
-
- testinputs :- testi ; true.
- è
- testi :-
- findinputs( Inputs ), !,
- member( [Gate,Input], Inputs ),
- memleft( Memleft1 ),
- print( '\nMemleft start gen: ', Memleft1 ),
- findinptests( Gate, Input, sa0 ),
- memleft( Memleft2 ),
- print( '\nMemleft after sa0: ', Memleft2 ),
- findinptests( Gate, Input, sa1 ),
- memleft( Memleft3 ),
- print( '\nMemleft after sa1: ', Memleft3 ),
- fail.
-
- findinputs( InpEls ) :-
- elements( Ellist ),
- inputs( Inputs ),
- finp( Inputs, [], InpEls ), !.
-
- finp( [], Netform, Netform ).
- finp( [Inputnet|InpnetRem], Netform, NetRet ) :-
- (
- Inputnet( _, _, [El|_] ),
- El( _, _, Nets, _ ),
- member( Inputnet, Nets, Num ),
- Numplus is Num + 1,
- finp( InpnetRem, [[El,Numplus]|Netform], NetRet )
- );
- finp( ElRem, InpnetRem, Netform, NetRet ).
-
-
-
- justify( Netvals, [], Netvals ).
- justify( Netvals, [El|Rem], NewNetReturn ) :-
- El( Type, _, Inputs, Outnet ),
- replcbyval( Netvals, Inputs, Vals, Varlist ),
- Type( Pc, _, _ ),
- (
- (
- member( Outnet(Output), Netvals ),
- !,
- Pc( Output, Implicants ),
-
- member( Implicant, Implicants ),
-
- Implicant = Vals,
- ad_vals_to_Net( Netvals, Varlist, NNetvals ),
- imply1( NNetvals, Rem, NNNewNet, Undef ),
- justify( NNNewNet, Undef, NewNetReturn )
- );
- (
- not( member( Outnet(Output), Netvals ) ),
- justify( Netvals, Rem, NewNetReturn )
- )
- ).
- è
-
-
-
-
- propagate( Netvals, [], Netvals, [], _ ).
- propagate( Netvals, Ellist, NNNNetvals, UndefR, Solved ) :-
- usecount(U),
- imply1( Netvals, Ellist, NNetvals, UndefEllist ),
- ddrive( NNetvals, UndefEllist, NNNetvals, [],
- UndefEllist2, Solved, Drive ),
- (
- (Solved == true, NNNNetvals = NNNetvals, UndefR = UndefEllist2, !);
- (
- Drive == true,
- propagate( NNNetvals, UndefEllist2, NNNNetvals, UndefR, Solved )
- )
- ).
-
- /* Here [] is the empty list of elements currently in the D-frontier. */
-
-
-
-
- ddrive( Netvals, [], Netvals, Undef, UndefR, _, _ ) :-
- revlist( Undef, UndefR ).
- ddrive( Netvals, [El|Remain], ReturnNewNet, Undefform,
- Undefreturn, Solved, Drive ) :-
- usecount(U),
- El( Type, _, Inputs, Outnet ),
- (
- (
- replcbyval( Netvals, Inputs, Vals, Varlist ),
- hasD( Vals ),
- Type( _, _, Prcube ),
- Prcube( Output, Implicants ),
- member( Implicant, Implicants ),
- Implicant = Vals,
- ad_vals_to_Net( Netvals, Varlist, NNetvals ),
- notdup( Outnet, Output, Netvals, NNetvals, NNNetvals ),
- Drive = true,
- (
- (
- outputs( Outlist ),
- member( Outnet, Outlist ),
- Solved = true, !,
- ReturnNewNet = NNNetvals,
- revlist( Undefform, UdfR ),
- appenddef( UdfR, Remain, Undefreturn )
- );
- ddrive( NNNetvals, Remain, ReturnNewNet,
- Undefform, Undefreturn, Solved, Drive )
- )
- );(
- ddrive( Netvals, Remain, ReturnNewNet,
- è [El|Undefform], Undefreturn, Solved, Drive ))
- ).
-
-
-
- hasD( Inputs ) :- vmember( d, Inputs ); vmember( db, Inputs ).
-
-
- imply1( Netvals, Ellist, NNetvals, UndefEllist2 ) :-
- imply( Netvals, Ellist, NNetvals, [], UndefEllist ),
- revlist( UndefEllist, UndefEllist2 ),
- !.
-
- imply( NewNetvals, [], NewNetvals, Undef, Undef ).
-
- imply( Netvals, [El|Remain], ReturnNewNet, Undefform, Undefreturn ) :-
- usecount(U),
- El( Type, _, Inputs, Outnet ),
- (
- (
- replcbyval( Netvals, Inputs, Vals, Varlist ),
- not( hasD( Vals ) ),
- Type( Pc, _, _ ),
- Pc( Output, Implicants ),
- member( Implicant, Implicants ),
- Implicant == Vals,
- notdup( Outnet, Output, Netvals, Netvals, NNNetvals ),
- imply( NNNetvals, Remain, ReturnNewNet, Undefform, Undefreturn)
- );
- imply( Netvals, Remain, ReturnNewNet, [El|Undefform], Undefreturn)
- ).
-
- notdup( Netval, Val, Netvals, NNetvals, NNetvals ) :-
- member( Netval(Extval), Netvals ),
- !,
- Extval == Val.
-
- notdup( Netval, Val, _, NNetvals, [Netval(Val)|NNetvals] ) :- !.
-
-
- ad_vals_to_Net( Netvals, Varlist, NewNet ) :-
- advals( Netvals, Varlist, NewNet ), !.
- advals( Netvals, [], Netvals ).
- advals( Netvals, [Head(Val)|Varlist], NNetvalsR ) :-
- (
- (
- atomic(Val),
- advals( [Head(Val)|Netvals], Varlist, NNetvalsR )
- );
- advals( Netvals, Varlist, NNetvalsR )
- ).
-
-
- /*
- Netvals = current assignments of nets: [n1(1), n5(0),.....,nn(x)]
- è Inputnets = input nets to specific gate: [n1,n3,..nx]
- Inputvals = [1,0,.d, db, 0]
- */
-
- replcbyval( A, B, C, NetVarlist) :-
- replcbyval1( A, B, C, [], NetVarlist ), !.
-
- replcbyval1( _, [], [], NetVarlist, NetVarlist ).
- replcbyval1( Netvals, [Inputnet|Restnets],
- [Inputval|Restvals], NetVarlist, NetVarR ) :-
- (
- (
- member( Inputnet( Inputval ), Netvals ),
- NetVarT = NetVarlist
- );
- (
- var( Inputval ),
- NetVarT = [Inputnet(Inputval)|NetVarlist]
- )
- ),
- replcbyval1( Netvals, Restnets, Restvals, NetVarT, NetVarR ).
-
- getinps( A, B ) :-
- inputs( Inplist ),
- getinps1( A, Inplist, [], B ), !, Inplist \= [].
-
- getinps1( _, [], Netandvals, Netandvals ).
- getinps1( Netvals, [Inputnet|Restnets], Inplistform, Retlist ) :-
- (
- member( Inputnet( Inputval ), Netvals ),
- getinps1( Netvals, Restnets,
- [Inputnet(Inputval)|Inplistform], Retlist )
- );
- getinps1( Netvals, Restnets, Inplistform, Retlist ).
-
- getoutp( A, B ) :-
- outputs( Outplist ),
- getoutp1( A, Outplist, [], B ), !, Outplist \= [].
-
- getoutp1( _, [], Netandvals, Netandvals ).
- getoutp1( Netvals, [Outputnet|Restnets], Outlistform, Retlist ) :-
- (
- member( Outputnet( Outputval ), Netvals ),
- (Outputval == d ; Outputval == db),
- getoutp1( Netvals, Restnets,
- [Outputnet(Outputval)|Outlistform], Retlist )
- );
- getoutp1( Netvals, Restnets, Outlistform, Retlist ).
-
-
-
-
-
- /* funclist = [nx,...,nx], arglist = [1,0,...,etc] */
- pairoff( [], [], Result, Result ).
- èpairoff( [Func|F_rem], [Arg|Arg_rem], Tlist, Reslist ) :-
- pairoff( F_rem, Arg_rem, [Func(Arg)|Tlist], Reslist ).
-
-
- /* Samples:
- Type: and3( pdcfand3, pcand3 ).
- Pdcfclass: pdcfand3( sa1(3), db, [[1,1,0]] ).
- Gate: r6( or3, 3, [n25,n26,n28], n34 ).
- */
-
- appenddef( L1, L2, L3 ) :- append( L1, L2, L3 ), !.
- append([],L,L).
- append([Z|L1],L2,[Z|L3]) :- append( L1,L2,L3 ).
-
-
- /* Non-instantiating member, for lists containing variables: */
- vmember( X, List ) :- member( Y, List ), X == Y, !.
-
-
-
- revlist( List, Reverse ) :- rev( List, [], Reverse ), !.
- rev( [], L, L ).
- rev( [H|List], Formlist, Retlist ) :-
- rev( List, [H|Formlist], Retlist ).
-
-